(()=>{ url_domain =(data)=> { let a = document.createElement('a'); a.href = data; return a.hostname; }; for (let script of document.getElementsByTagName('script')) { if (script.src.indexOf('messenger')>=0) { let url = script.src; window.messangerSrc = url_domain(url); break; } } })(); class ChatMessenger { asyncLoadScripts (origin) { this.loadCSS(`${origin}/messenger/css/messenger.css?cache=` + Date.now()); this.loadCSS(`//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css`); console.log('origin', `${origin}js/mediasoup3/easy-mediasoup.bundle.min.js`); let files = [ `//cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.slim.js`, '//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js', '//cdnjs.cloudflare.com/ajax/libs/jqueryui-touch-punch/0.2.3/jquery.ui.touch-punch.min.js', `${origin}js/mediasoup3/easy-mediasoup.bundle.min.js`, `${origin}js/mediasoup3/mediasSoup3.js`, `https://cdn.jsdelivr.net/npm/lsx-emojipicker@1.1.2/jquery.lsxemojipicker.min.js`, `https://cdn.jsdelivr.net/npm/hark@1.2.3/hark.bundle.js` ]; if(!window.jQuery) { files.unshift('//cdnjs.cloudflare.com/ajax/libs/jquery/1.11.1/jquery.min.js'); } let checkStateAndCall = (path, callback) => { let _success = false; return function () { if (!_success && (!this.readyState || (this.readyState === 'complete'))) { _success = true; callback(); } }; }; let loadNext = () => { // chain element if (!files.length) { this.init(); return; } let path = files.shift(); let scriptElm = document.createElement('script'); scriptElm.type = 'text/javascript'; scriptElm.async = true; scriptElm.src = path; scriptElm.onload = scriptElm.onreadystatechange = checkStateAndCall(path, loadNext); // load next file in chain when let headElm = document.head || document.getElementsByTagName('head')[0]; headElm.appendChild(scriptElm); }; loadNext(); // start a chain }; ago(date) { let plurial; let seconds = Math.floor((new Date() - date) / 1000); let interval = Math.floor(seconds / 31536000); if (interval > 0) { if (interval>1) { return eval(this.traductions.yearsAgo); } else { return eval(this.traductions.yearAgo); } } interval = Math.floor(seconds / 2592000); if (interval > 0) { if (interval>1) { return eval(this.traductions.monthsAgo); } else { return eval(this.traductions.monthAgo); } } interval = Math.floor(seconds / 86400); if (interval > 0) { if (interval>1) { return eval(this.traductions.daysAgo); } else { return eval(this.traductions.dayAgo); } } interval = Math.floor(seconds / 3600); if (interval > 0) { if (interval>1) { return eval(this.traductions.hoursAgo); } else { return eval(this.traductions.hourAgo); } } interval = Math.floor(seconds / 60); if (interval > 0) { if (interval>1) { return eval(this.traductions.minutesAgo); } else { return eval(this.traductions.minuteAgo); } } return 'now'; }; isEmpty (obj){ return Object.keys(obj).length === 0 && obj.constructor === Object; }; getDateAgo (date) { let res = new Date(date).getTime(); return ago(res); }; loadCSS (src) { let head = document.getElementsByTagName('HEAD')[0]; let link = document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; link.href = src; head.appendChild(link); }; async getWebmasterid (url) { let res = await $.ajax({ url: this.ajax, type: 'POST', data: {a:'getWebmasterid', url:url} }); return parseInt(res); }; constructor(myUser = {}, notification = {}, callBackAddUser = false, callBackRemoveUser = false, traductions={}) { this.traductions = { yourMessage: "Your message", minuteAgo: "`${interval} min ago.`", minutesAgo: "`${interval} mins ago.`", hourAgo: "`${interval} hour ago.`", hoursAgo: "`${interval} hours ago.`", dayAgo: "`${interval} day ago.`", daysAgo: "`${interval} days ago.`", monthAgo: "`${interval} month ago.`", monthsAgo: "`${interval} months ago.`", yearAgo: "`${interval} year ago.`", yearsAgo: "`${interval} years ago.`", }; this.traductions = { ...traductions, ...this.traductions}; if (!window.messangerSrc) { window.messangerSrc = 'html5-chat.com'; } let origin = `//${window.messangerSrc}/`; if (myUser.ajax) { this.ajax = myUser.ajax; } else { this.ajax = origin + 'ajax.php'; } if (!myUser.el) { myUser.el = 'button[data-userid], div[data-userid]'; } if (!myUser.imagePath) { myUser.imagePath = ''; } this.myUser = myUser; this.users = new Map(); this.mutedUsers = new Map(); this.container = 'messengerContainer'; this.notification = notification; this.callBackAddUser = callBackAddUser; this.callBackRemoveUser = callBackRemoveUser; this.socket = {}; this.asyncLoadScripts(origin); }; pickRandomAvatar () { let rnd = Math.round(Math.random()*10) + 1; return `https://html5-chat.com/img/avatars/${rnd}.svg`; }; async getConfig (webmasterid) { let res = await $.ajax({ url: this.ajax, type: 'POST', data: {a:'getConfig', webmasterid:webmasterid} }); return JSON.parse(res); }; async getDefaultRoom (webmasterid) { let res = await $.ajax({ url: this.ajax, type: 'POST', data: {a:'getDefaultRoom', webmasterid:webmasterid} }); return JSON.parse(res); }; getMuted () { $.post(this.ajax, {a:'getMutedUsersAsArray', webmasterid:this.myUser.webmasterid, userid:this.myUser.id}, (jsonMuted)=> { if (jsonMuted) { jsonMuted = JSON.parse(jsonMuted); jsonMuted.forEach((muted) => { this.mutedUsers.set(muted.muteduserid, muted); let temp = `#messengerNotificatorContent div.messengerNotificatorUserItem[data-userid=${muted.muteduserid}]`; $(temp).addClass('muted'); }); } this.restoreWindows(); }); }; getUsersWhoSentMeMessages () { this.socket.emit('getUsersWhoSentMeMessages', (messages)=>{ if (!messages) return; messages = JSON.parse(messages); messages.forEach((message) => { let extra = JSON.parse(message.extras); let id = parseInt(message.fromid); let status = (this.users.get(id))?'messengerOnline':'messengerOffline'; let user = {id: id, username:extra.from, avatar:extra.avatar, status:status}; this.addUser(user); }); }); }; async promptForUsername (){ return new Promise((resolve)=>{ let template = `
`; jQuery('#messengerContainer').append(template); jQuery(document).on('keyup', '#messengerInput', (e) => { e.preventDefault(); e.stopImmediatePropagation(); let keyCode = e.keyCode || e.which; if (keyCode===13) { let username = jQuery(e.currentTarget).val(); if (username) { jQuery('#modalMessenger').remove(); resolve(username); } } }); }); }; filterUsers (username = '') { let filterOnline = $('#filterOnlineUsers').hasClass('onlineFilter'); jQuery('#messengerNotificatorContent .messengerNotificatorUserItem').show(); if (filterOnline) { let $els = $('div.messengerStatus.messengerOffline'); $els.each((index, element)=> { $(element).parent().hide(); }); } if (!username) return; let temp = `#messengerNotificatorContent .messengerNotificatorUserItem:not([data-username*='${username}'])`; jQuery(temp).hide(); console.log('filterOnline', filterOnline); }; addMessengerNotificator (){ let template = `
${this.traductions.users}
`; jQuery('#' + this.container).append(template); let $messengerNotificatorHeader = jQuery('#messengerNotificatorHeader'); $messengerNotificatorHeader.on('mouseup', ()=> { $('#messengerNotificator').toggleClass('messengerNotificatorMinimized'); }); jQuery('#messengerClearSearch').on('mouseup', ()=> { $('#messengerNotificatorSearch').val(''); this.filterUsers(); }); jQuery('#messengerNotificatorSearch').on('keyup', (e)=>{ e.preventDefault(); e.stopImmediatePropagation(); let search = jQuery(e.currentTarget).val(); this.filterUsers(search); }); jQuery('#filterOnlineUsers').on('mouseup', (e)=> { e.preventDefault(); e.stopImmediatePropagation(); jQuery(e.currentTarget).toggleClass('onlineFilter'); let search = jQuery(e.currentTarget).val(); this.filterUsers(search); }); jQuery('#messengerExit').on('mouseup', (e)=>{ localStorage.removeItem('user'); jQuery.each(localStorage, (key, data)=>{ if (typeof key === 'string' && key.indexOf('messenger_')===0) { localStorage.removeItem(key); } }); window.location = this.config.quitUrl; }); }; async init () { let el = `
`; if (!jQuery(`#${this.container}`).length) { jQuery('body').append(el); } if (this.isEmpty(this.notification)) { this.addMessengerNotificator(); } let localUser = localStorage.getItem('user') ? JSON.parse(localStorage.getItem('user')) : false; if (!this.myUser.avatar) { this.myUser.avatar = this.pickRandomAvatar(); } if (!this.myUser.username) { this.myUser.username = (localUser && localUser.username) ? localUser.username : await this.promptForUsername(); } if (!this.myUser.id) { this.myUser.id = (localUser && localUser.id)? localUser.id :Date.now(); } this.myUser.streamid = Date.now(); localStorage.setItem('user', JSON.stringify(this.myUser)); if (!this.myUser.webmasterid) { this.myUser.webmasterid = (localUser && localUser.webmasterid) ? localUser.webmasterid : await this.getWebmasterid(window.messangerSrc); } localStorage.setItem('user', JSON.stringify(this.myUser)); console.log('init..', this.myUser); jQuery('button[data-userid]').addClass('messengerOffline'); this.initEvents(); setInterval(()=>{ jQuery('#messengerContainer div.content div.messages span.timeAgo').each((index, element)=> { let date = jQuery(element).data('ago'); let ago = this.ago(date); jQuery(element).text(ago); }); }, 60000); this.config = await this.getConfig(this.myUser.webmasterid); this.myUser.room = await this.getDefaultRoom(this.myUser.webmasterid); this.connectToServer(); this.getMuted(); }; getChat(userid){ return jQuery(`#messengerContainer div.content[data-userid=${userid}]`); }; updateElements (user) { //console.log('updateElements', user); jQuery(`button[data-userid=${user.id}]`).removeClass('messengerOffline').removeClass('messengerOnline').addClass(user.status); jQuery(`#messengerContainer div.header`).removeClass('messengerOffline').removeClass('messengerOnline').addClass(user.status); }; updateUsersNumber () { jQuery('#messengerNotificatorCounter').text(this.users.size); }; connectToServer () { if (this.myUser.username.length>50) { return; } this.socket = io.connect(this.config.nodeMessenger, { 'force new connection': true, transports: ['websocket'], secure: true, query: this.myUser }); this.socket.on('connected', ()=> { console.log('Connected to server !'); this.socket.emit('enterRoom', this.myUser); //connectMS(this.config.webrtcServerUrl, this.myUser.id, this.config.VIDEO_CONSTRAINTS); this.updateNotification(); }); this.socket.on('call1to1', (user)=> { if (this.mutedUsers.has(user.id)) { return; } let $chat = this.getChat(user.id); let message = `${user.username} requested a video call.`; this.serverMessage($chat, message, 'serverMessage'); if (this.myUser.call1to1User) { return; } user.isCaller = true; this.myUser.call1to1User = user; this.displayCall1to1(user); }); this.socket.on('call1to1Cancelled', (user)=> { this.closeMyWebcam(); console.log(user); }); this.socket.on('call1to1Accepted', (user)=> { jQuery('div.messengerWebcamContainer div#MessengerPhotoCallerContainer').hide(); playStream(user.streamid, '#hisMessengerVideo'); jQuery('#hisMessengerVideo').show(); jQuery('#messengerMuteAudioBtn').removeClass('hiddenButton'); jQuery('#messengerToggleWebcamBtn').addClass('hiddenButton'); }); this.socket.on('getUsers', (usersInRoom)=> { //console.log('getUsers', usersInRoom); for (let userid in usersInRoom) { let user = usersInRoom[userid]; user.status = 'messengerOnline'; this.addUser(user); if (this.callBackAddUser) { this.callBackAddUser(user); } user.status = 'messengerOnline'; this.updateElements(user); } this.getUsersWhoSentMeMessages(); }); this.socket.on('receiveMessenger', (fromUser, toUser, message, extras)=> { if (this.mutedUsers.has(parseInt(fromUser.id))) { return; } this.appendMessage(fromUser, toUser, message, extras); this.playMP3(this.config.soundPrivateMessageReceived); }); this.socket.on('messengerWrites', (user)=> { let $e = jQuery(`#messengerContainer div.content[data-userid=${user.id}] span.isWrtiting`); if (!$e.hasClass('writesBlink')) { $e.addClass('writesBlink'); setTimeout(()=> { $e.removeClass('writesBlink'); }, 4500); } }); this.socket.on('addUser', (user)=> { if (this.callBackAddUser) { this.callBackAddUser(user); } user.status = 'messengerOnline'; this.updateElements(user); this.addUser(user); }); this.socket.on('removeUser', (user)=> { user.status = 'messengerOffline'; this.updateElements(user); if (this.callBackRemoveUser) { this.callBackRemoveUser(user); } this.removeUser(user); if (this.myUser.call1to1User && this.myUser.call1to1User.id === user.id) { this.closeMyWebcam(); } }); }; removeUser (user) { let el = `#messengerNotificatorContent div.messengerNotificatorUserItem[data-userid=${user.id}] div.messengerStatus`; jQuery(el).removeClass('messengerOnline').removeClass('messengerOffline').addClass('messengerOffline'); this.updateUsersNumber(); this.users.delete(parseInt(user.id)); }; addRandomUsers (num = 50) { for(let i=0;i `; if (user.gender && user.gender!=='undefined' && jQuery(`#genderChecboxContainer${user.gender}`).length===0) { jQuery('#genderFilterDiv').append(genderEl); } let eluser = `#messengerNotificatorContent div.messengerNotificatorUserItem[data-userid=${user.id}]`; $(eluser).remove(); let $messengerNotificatorContent = jQuery('#messengerNotificatorContent'); if (!$messengerNotificatorContent.length) return; let title = (this.myUser.id===user.id)?"That's you !" : user.username; let profileEl = (user.profile)?``:''; let gender = (user.gender)?user.gender:''; let el = `
${user.username}
${profileEl}
`; $messengerNotificatorContent.prepend(el); this.users.set(parseInt(user.id), user); this.updateUsersNumber(); this.updateFilterGenders(); }; messengerWindowDelete (userid) { localStorage.removeItem(`messenger_${userid}`); }; messengerWindowSave (user) { let $chat = this.getChat(user.id); let top = $chat.css('top'); let left = $chat.css('left'); let data = {username:user.username, left:left, top:top, avatar:user.avatar}; localStorage.setItem(`messenger_${user.id}`, JSON.stringify(data)); }; messengerWindowRestore (user) { let data = localStorage.getItem(`messenger_${user.id}`); if (data) { data = JSON.parse(data); let $chat = this.displayChat(user); $chat.css('left', data.left); $chat.css('top', data.top); } }; restoreWindows () { jQuery.each(localStorage, (key, data)=>{ if (typeof key === 'string') { let arr = key.split('messenger_'); if (arr.length > 1) { try { data = JSON.parse(data); let user = {id: arr[1], username: data.username, avatar:data.avatar}; this.messengerWindowRestore(user); } catch(e) { } } } }); }; sendMessenger (message, toUser, extras={}) { extras.time = Date.now(); extras.from = this.myUser.username; extras.avatar = this.myUser.avatar; this.socket.emit('sendMessenger', this.myUser, toUser, message, extras); }; call1to1HangOut () { this.socket.emit('call1to1Cancelled', this.myUser.call1to1User.id); this.closeMyWebcam(); }; closeMyWebcam () { unpublishOwnFeed('#myMessengerVideo'); jQuery('.messengerWebcamContainer').remove(); delete ChatHTML5.myUser.call1to1User; }; displayCall1to1 (userWhoCalls) { let classeWebcamBtn = (parseInt(this.myUser.id) === parseInt(userWhoCalls.id))?'hiddenButton':''; let template = `
${this.myUser.call1to1User.username}
${this.myUser.call1to1User.username}
`; jQuery('#messengerContainer').append(template); }; updateNotification () { this.socket.emit('getCountMessengerUnread', (messageCount)=>{ if (!messageCount) { messageCount = ''; } let html = `
${messageCount}
`; jQuery(this.notification.id).html(html); }); }; selectChat (user) { let $chat = this.getChat(user.id); if (!$chat.length) { $chat = this.displayChat(user); } else { $chat.find('input').focus(); } return $chat; }; serverMessage ($chat, message, classe='serverMessage'){ let now = Date.now(); let ago = this.ago(now); let el = `
${ago}
${message}
`; let $messages = $chat.find('.messages'); $messages.append(el); let objDiv = $messages[0]; if (objDiv) { objDiv.scrollTop = objDiv.scrollHeight; } }; appendMessage (fromUser, toUser, message, extras='') { //console.log('appendMessage', fromUser, toUser, message, extras); let classe = 'messageOther'; let $chat; if (fromUser.id === this.myUser.id) { $chat = this.getChat(toUser.id); classe = 'messageMine'; } else { let exists = this.getChat(fromUser.id).length; $chat = this.selectChat(fromUser); if (!exists){ return; } } if (!$chat.length) return; let ago = this.ago(extras.time); let el = `
${fromUser.username}${ago}
${message}
`; let $messages = $chat.find('.messages'); $messages.append(el); let objDiv = $messages[0]; if (objDiv) { objDiv.scrollTop = objDiv.scrollHeight; } }; updateFilterGenders() { jQuery('#genderFilterDiv input').each(function(i, el) { let genre = $(el).val(); let $checkBox = jQuery(`#genderChecbox${genre}`); if ($checkBox.prop('checked')) { $(`#messengerNotificatorContent div.${genre}`).show(); } else { $(`#messengerNotificatorContent div.${genre}`).hide(); } }); } displayChat (user) { user.id = parseInt(user.id); let headerClass = (this.users.get(user.id) && this.users.get(user.id).status ==='messengerOnline') ?'messengerOnline':'messengerOffline'; let mutedClass = (this.mutedUsers.get(user.id)) ?'muted':''; let username = (user.profile!=="undefined")?`${user.username}`:user.username; let template = `
${user.username} ${username} is writing
`; jQuery('#messengerContainer').append(template); jQuery(`div[data-userid=${user.id}]`).draggable({ containment: 'parent', stack: 'div', handle: 'div.header', stop: ( e, ui )=> { console.log(ui.position.left, ui.position.top); this.messengerWindowSave(user); } }); let $chat = this.getChat(user.id); this.messengerWindowSave(user); $chat.find('input').focus(); $chat.find('.messengerEmojiBtn').lsxEmojiPicker({ onSelect:(emoji)=>{ let input = $(event.currentTarget).parents('form.footer').find('input')[0]; const value = input.value; const start = input.selectionStart; const end = input.selectionEnd; let textToInsert = emoji.value.replace('&#','0'); input.value = value.slice(0, start) + String.fromCodePoint(textToInsert) + value.slice(end); // update cursor to be at the end of insertion input.selectionStart = input.selectionEnd = start + textToInsert.length; input.focus(); } }); // get History if (this.mutedUsers.has(parseInt(user.id))) { return false; } this.socket.emit('getMessengerMessages', user.id, (messages)=>{ messages = JSON.parse(messages); messages = messages.reverse(); messages.forEach((message) => { let extras = JSON.parse(message.extras); if (parseInt(message.fromid) === parseInt(this.myUser.id)) { let user = {id:message.toid, username:extras.from, avatar:extras.avatar}; this.appendMessage(this.myUser, user, message.message, extras); } else { let user = {id:message.fromid, username:extras.from, avatar:extras.avatar}; this.appendMessage(user, this.myUser, message.message, extras); } }) }); this.updateNotification(); return $chat; }; displayMenuMessages (messages) { if (!messages.length){ return; } let menuItems = ''; messages.forEach((message) => { let extra = JSON.parse(message.extras); let classeBall = (this.users.get(parseInt(message.fromid)))?'online':''; let menuItem = ` `; menuItems+=menuItem; }); let el = ` `; this.removeMenu(); let $notificationElementId = jQuery(this.notification.id); $notificationElementId.remove('.menu'); $notificationElementId.append(el); }; removeMenu () { jQuery(`${this.notification.id} .menuMessenger`).remove(); }; playMP3 (mp3file, loop=false) { if (!mp3file) { return; } try { let soundMP3 = new Audio(); if (soundMP3.paused) { soundMP3.src = mp3file; soundMP3.loop = loop; try { soundMP3.play().catch(function() { }); } catch(e) { console.log('error playsound', mp3file); } } } catch(e) { console.log('error playsound', mp3file); } }; initEvents () { let $messengerContainer = jQuery('#messengerContainer'); $messengerContainer.on('mousedown', 'button.closeBtn', (e) => { e.stopImmediatePropagation(); let $chat = jQuery(e.currentTarget).closest('.content'); let userid = $chat.data('userid'); this.messengerWindowDelete(userid); $chat.remove(); }); $messengerContainer.on('mouseup', 'button.clearMessengerBtn', (e) => { let message = `Are you sure you want to clear this chat ? `; let $chat = jQuery(e.currentTarget).closest('.content'); this.serverMessage($chat, message); }); $messengerContainer.on('mouseup', 'button[data-answer]', (e) => { e.stopImmediatePropagation(); let answer = ($(e.currentTarget).data('answer')==='yes'); let $chat = jQuery(e.currentTarget).closest('.content'); $(e.currentTarget).parent().parent().remove(); if (answer) { let userid = $chat.data('userid'); console.log('userid', userid); $chat.find('div.messages').empty(); this.socket.emit('deleteMessengerMessages', userid); } }); $messengerContainer.on('mouseup', 'button.muteUserBtn', (e) => { e.stopImmediatePropagation(); $(e.currentTarget).toggleClass('muted'); let $el = jQuery(e.currentTarget).closest('[data-userid]'); let muteduserid = $el.data('userid'); let username = $el.data('username'); let val = !this.mutedUsers.has(muteduserid); this.socket.emit('messengerMute', muteduserid, val); let $chat = this.getChat(muteduserid); let message; if (val) { message = sprintf(this.traductions['userHasBeenMutedBanned'], username); this.mutedUsers.set(muteduserid, {id:muteduserid, username:username}); } else { message = sprintf(this.traductions['userHasBeenUnmutedUnbanned'], username); this.mutedUsers.delete(muteduserid); } $(`#messengerNotificatorContent div.messengerNotificatorUserItem[data-userid=${muteduserid}]`).toggleClass('muted'); this.serverMessage($chat, message); }); $messengerContainer.on('mouseup', 'button.webcamBtn', (e) => { e.stopImmediatePropagation(); let id = jQuery(e.currentTarget).closest('[data-userid]').data('userid'); let user = this.users.get(parseInt(id)); if (!user) return; user.isCaller = false; this.myUser.call1to1User = user; this.displayCall1to1(this.myUser); publishOwnFeed('#myMessengerVideo', this.myUser.streamid); }); jQuery(document).on('change', '#genderFilterDiv input', (e)=> { this.updateFilterGenders(); }); jQuery(document).on('mouseup', ()=>{ this.removeMenu(); }); jQuery(document).on('mouseup', 'div.menuMessenger .menuMessengerItem', (e)=> { e.stopImmediatePropagation(); e.stopImmediatePropagation(); let $e = jQuery(e.currentTarget); let user = {id:$e.data('id'), username:$e.data('username'), avatar:$e.data('avatar'), profile:$e.data('profile')}; this.removeMenu(); this.displayChat(user); }); jQuery(document).on('getMyStreamId', ()=> { console.log('call1to1', this.myUser.call1to1User.id); if(this.myUser.call1to1User.isCaller) { this.socket.emit('call1to1Accepted', this.myUser.call1to1User.id); } else { this.socket.emit('call1to1', this.myUser.call1to1User.id); } }); $messengerContainer.on('keyup', 'form.footer input', (e) => { e.preventDefault(); e.stopImmediatePropagation(); let keyCode = e.keyCode || e.which; if (!this.myUser.isWriting) { console.log('isWriting !!!'); this.myUser.isWriting = true; let userid = jQuery(e.constructor).find('[data-userid]').data('userid'); this.socket.emit('messengerWrites', userid); setTimeout(()=> { this.myUser.isWriting = false; }, 5000); } if (keyCode === 13) { let message = jQuery(e.currentTarget).val(); if (!message) return; jQuery(e.currentTarget).val(''); let $content = jQuery(e.currentTarget).closest('.content'); let id = $content.data('userid'); let username = $content.data('username'); let avatar = $content.data('avatar'); let user = {id:id, username:username, avatar:avatar}; this.sendMessenger(message, user); } }); jQuery(document).on('mousedown', this.myUser.el, (e) => { e.stopImmediatePropagation(); let $e = jQuery(e.currentTarget); let userid = $e.data('userid'); let username = $e.data('username'); let avatar = $e.data('avatar'); let profile = $e.data('profile'); if (parseInt(userid)===parseInt(ChatHTML5.myUser.id)) return; let user = {id:userid, username:username, avatar:avatar, profile:profile}; this.selectChat(user); }); jQuery(document).on('mouseup', 'button#messengerHangoutBtn', () => { this.call1to1HangOut(); }); jQuery(document).on('mouseup', 'button#messengerMuteAudioBtn', (e) => { let $e = jQuery(e.currentTarget); $e.toggleClass('muted'); mute('#myMessengerVideo', $e.hasClass('muted')); }); jQuery(document).on('mouseup', 'button#messengerToggleWebcamBtn', () => { //this.socket.emit('call1to1Accepted', this.myUser.call1to1User.id); publishOwnFeed('#myMessengerVideo', this.myUser.streamid); }); jQuery(document).on('getMyStreamId', ()=> { ChatHTML5.myUser.webcam = true; //ChatHTML5.cameraStatus(false); }); let $notificationElementId = jQuery(this.notification.id); if ($notificationElementId.length) { jQuery(document).on('mouseup', this.notification.id, ()=>{ this.socket.emit('getMessengerUnread', (messages)=>{ messages = JSON.parse(messages); console.log('getMessengerMessages', messages); this.displayMenuMessages(messages); }); }) } }; }var ChatHTML5 = new ChatMessenger(, {}, false, false, {"id":"847","webmasterid":"51627","roomList":"Liste des autres salons","privateOn":"Priv\u00e9","privateOff":"Priv\u00e9","camOn":"Camera","camOff":"Camera","soundOn":"son actif","soundOff":"son desactiv\u00e9","searchUsers":"Search user","online":"oen ligne","chatWithSomeone":"chat with %s","chatInRoom":"chat in %s","name":"Nom","action":"Action","join":"Join","close":"Quittez","quit":"Quittez","cleanChat":"Clear chat","smileys":"Smileys","quitChat":"Quit chat ?","login":"Entrer","chooseAnUsername":"Choose an username","showMyWebcamToAnyone":"Show my webcam to anyone","myWebcamIsPublic":"Public webcam","myWebcamIsPrivate":"Priv\u00e9 webcam","showMyWebcamOnlyOnInvitation":"Afficher ma webcam uniquement sur invitation","changeAvatar":"Changer d'avatar","statusOnline":"Statut en ligne","statusOffline":"Statut hors ligne","statusBusy":"Statut occup\u00e9","private":"Priv\u00e9","kickUser":"Expulser un utilisateur","banUser":"Bannir un utilisateur","ban":"Interdire","chooseDurationIfTheBanInMinutes":"Choose duration of the ban (in minutes)","explainWhyYouBan":"Explain why you ban that user","forgottenPassword":"Mot de passe oubli\u00e9 ?","password":"Mot de passe","usernameOrEmail":"Nom d'utilisateur ou email","enterYourUsernameOrEmail":"Entrez votre nom d'utilisateur ou votre email","enterYourEmail":"Entrez votre adresse e-mail","register":"Enregistrer","username":"Nom d'utilisateur","email":"Email","confirmPassword":"Confirmez votre mot de passe","enterYourUsername":"Entrez votre nom d'utilisateur","enterYourPassword":"Entrez votre mot de passe","createNewRoom":"Cr\u00e9er une nouvelle salle","enterNameOfRoom":"Entrez le nom de la salle","enterWelcomeMessage":"Bienvenue sur le tchat de Samantha et ses copines","welcome":"Bienvenue","publicRoom":"Salle publique","privateRoom":"Salon priv\u00e9","createRoom":"Creer un salon","rooms":"Salon","chatters":"Chatters","enterPassword":"Entrez le mot de passe","passwordIncorrect":"Mot de passe incorrect","youHaveBeenKicked":"Vous avez \u00e9t\u00e9 expuls\u00e9 !","unreadMessages":"Messages non lus","watchesMe":"Regarde moi","badLoginOrPassword":"Mauvais identifiant ou mot de passe","youHaveBeenBannedFromChat":"You have been banned from the chat for %s<\/b> minutes.
Reason:%s","youHaveBeenKickedByUser":"You have been kicked from the chat by %s","youAreNowWatchingUser":"You are watching %s","userHasClosedPrivateChat":"%s has closed private chat","requestAPrivateChat":"requests a private chat","accept":"Accepter","deny":"Refuser","mute":"Ignorez","requestsAVideoChat":"demande un chat vid\u00e9o","youRequestedAPrivateChatWith":"Vous avez demand\u00e9 une conversation priv\u00e9e avec","privateWith":"priv\u00e9 avec","youEequestedWatchWebcamOf":"Vous avez demand\u00e9 une webcam de","webcamNumberMaximumReached":"Nombre maximum de webcams atteint","invalidImageType":"Type d'image invalide","invalidImageSize":"Taille d'image invalide","thisEmailIsAlreadyUsed":"This email is already used","thisUsernameIsTaken":"This username is already used","youCannotUseJunkEmailService":"Junk email are forbidden","checkYourEmailToConfirm":"Check your email %s to confirm","emailWithPasswordHasBeenSent":"An email containing your password has been sent","emailNotFoundInDatabase":"So such email in our database","unmuteUser":"Unmute %s","muteUser":"Mute %s","privateWithX":"Ask private chat with %s","kickUserX":"Kick %s","banUserX":"Ban %s","youJustKickedX":"You kicked %s","toInviteForPrivateChatYouMustEnablePrivateChatsYourself":"To invite for private chat, you must enable privates. Enable private now ?","passwordDoNotMatch":"Password do not match","invalidEmail":"invalid email","invalidPassword":"Invalid password","invalidUsername":"Invalid username","isWriting":"is writing","home":"Home","enterChat":"Entrer sur le tchat","Enter your email here":"Entrer vore adresse Email","Choose your username":"Choisissez votre nom d'utilisateur","Choose your password":"Choisissez votre mot de passe","Sign Up":"S'inscrire","Full":"Full","PleaseRegisterYoGetYourOwnCopy":"Free version of html5-chat<\/a>Please register.","quickPrivateMessage":"Message priv\u00e9","quickPrivateMessageTo":"Message priv\u00e9 rapide \u00e0 %s","myWebcam":"Ma webcam","pushToTalk":"Push to Talk","youNeedToEnableYourWebcamToPushToTalk":"Vous devez activer votre webcam pour appuyer sur le bouton \u00ab T\u00e9l\u00e9charger \u00bb","youAreTalking":"You talk...","userIsTalking":"%s is talking","userDeniedPrivateChat":"Chat priv\u00e9 refus\u00e9 par l'utilisateur","quizBadAnswer":"<\/i> Sorry, bad answer","quizGoodAnswer":"<\/i> Congratulations to %s<\/b> for the good answer %s<\/b>","quizGoodAnswer1":"<\/i> Congratulations to %s<\/b> for the good answer %s<\/b>","quizGoodAnswer2":"<\/i> Greeatings to %s<\/b> for the good answer %s<\/b>","quizGoodAnswer3":"<\/i> Bravo to %s<\/b> for the good answer %s<\/b>","quizGoodAnswer4":"<\/i> Well done %s<\/b> for the good answer %s<\/b>","quizGoodAnswer5":"<\/i> GREAT ! %s<\/b> gave the good answer %s<\/b>","guestUserIsNotAllowed":"You need to register to use that feature","whoSings":"Who sings ?","Clue":"Clue","watchAtMe":"Watching me:","userInfo":"Informations utilisateur","BroadcastOff":"Diffusion d\u00e9sactiv\u00e9e","BroadCasting":"Diffusion","ConfirmBroadcast":"Confirmer la diffusion ?","XhasLeftTheChat":"%s a quitt\u00e9 le chat","XhasJoinedTheChat":"%s a rejoint le chat","Calendar":"Calendrier","Send":"Envoyer","SeeMyProfile":"Voir mon profil","Parameters":"Param\u00e8tres","youAlreadyAskedForPrivate":"Vous avez d\u00e9j\u00e0 demand\u00e9 un rendez-vous priv\u00e9","Camera":"Camera","Sound":"Son","Friends":"Amis","Close youtube":"Close youtube","Pick a room":"Choisissez un salon","Delete User Messages":"Supprimer les messages","Whisper":"Chuchoter","Confirm clear chat":"Confirmer l'effacement du cha","Mute as Ban":"Muet","enterYourTextHere":"Entrez votre texte ici, Maj+Entr\u00e9e pour multiligne","Profile":"Profil","now":"Maintenant","yearsAgo":"%s year%s ago","monthsAgo":"%s month%s ago","daysAgo":"%s day%s ago","hoursAgo":"%s hour%s ago","minutesAgo":"%s minute%s ago","confirm":"Confirmer","users":"Utilisateurs","Flash Streaming only":"Flash Streaming only","Flash Streaming or Webrtc Streaming":"Flash or Webrtc Streaming","Report User":"Report %s to admin","Report Description":"Report Description","Report":"Report","Report Send to Admin":"Rapport envoyer \u00e0 l'administra","Maxumum number of users in room reached. Pick another room":"Maxumum number of users in room reached. Pick another room","Show IP":"Show IP","doubleConnect":"Disconnected : connected from other place","privateChat":"Priv\u00e9","Globally Mute user":"Globally Mute user","enterYourTextHereInRoom":"Chat in room %s: enter text here (Shift + Enter for multilines)","chatPrivateWith":"Private chat with %s","removeFriend":"Remove Friend","approveFriend":"Accept as friend","resendFriend":"Resend friend request","removeUserFromFriends":"Remove %s<\/b> from my friends ?","acceptUserAsFriends":"Accept %s<\/b> as friend ?","resendUserRequest":"Resend friend request to %s<\/b> ?","requestFriend":"Friend request","FriendRequested":"Friend requested","UserRefused":"User refused","UserRefusedToBeYourFriend":"Sorry but %s<\/b> refused to be your friend","UserAccepted":"Utilisateur accept\u00e9","YouAreNowFriendWith":"You are now friend with %s<\/b>.","UserDeleted":"Delete friend","UserIsNotYourFriendAnyMore":"%s<\/b> is not your friend any more","createMyRoom":"Cr\u00e9er mon salon","errorCreatingRoom":"Error, room not created","maxNumberOfRoomCreatedReached":"Vous ne pouvez pas cr\u00e9er de nouveaux salons","roomDeleted":"salle supprim\u00e9e","roomWasDeleted":"Room %s<\/b> was deleted","inviteUserIntoPrivateRoom":"Invite %s to join room %s","userWouldLikeToInviteToHisPrivateRoom":"%s<\/b> invites you to join his room %s<\/b>","Number":"Nombre","do not disturb with private requests":"Ne d\u00e9rangez pas avec les demandes de chat priv\u00e9","do not play sound effects":"Ne jouez pas d'effets sonores","chooseDurationOfMuteInMinutes":"Choose duration of the mute (jail). Jailed user cannot write in chat (in minutes)","mutePrisonUser":"Jail user","Webcam error: Please use Firefox or Chrome browser":"Erreur de webcam : veuillez utiliser le navigateur Chrome","Webcam error: Please use Safari":"Erreur de webcam : veuillez utiliser Safari","minutesMute":"Jail in minutes","warnUserOfMute":"Warn user that he was jailed","youHaveBeenMutedForMinutes":"You have been muted for %s minutes.
Reason:%s","MaximumSizeAllowed":"Taille maximale permise : %s Kbytes","ThisRoomAllowedToGenderOnly":"This room is only allowed to gender %s","All":"Tout","Reserved to gender":"R\u00e9serv\u00e9 au sexe","NotReserverToGender":"Non r\u00e9serv\u00e9 - tout le monde peut partici","promoteUser":"Promote user","promoteUserX":"Promote %s in room %s as:","youHaveBeenPromotedto":"You have been promoted to role %s","PermanentPromote":"Permanent Promote","Search":"Chercher","lockChatScroll":"Lock\/Unlock the chat scroll","unlockChatScroll":"Unlock chat scroll","help":"Fonctionnement du tchat","quitAndDisconnect":"Quitter et se d\u00e9connecter","userHasBeenKicked":"<\/i> %s<\/b> has been ejected from chat","userHasBeenBanned":"<\/i> %s<\/b> has been banned from chat","userHasBeenMutedBanned":"<\/i> %s<\/b> has been muted on chat","Gifs and upload":"Gifs et t\u00e9l\u00e9chargement","Backgrounds":"Arri\u00e8re-plans","confirmKick":"Confirmer","jailUserX":"Jail\/Mute %s","explainWhyYouMute":"Explain why you jail","enterAsGuest":"Entrer en tant qu'invit\u00e9","purchase Credits":"%s<\/span> credits. Purchase.","Sorry, you dont have enough credits":"Sorry, you dont have enoug credits.
Puchase now ?","Private chat costs is":"Private chat cost is %s<\/b> credits per minute.
Do you want to start the private chat ?","Private chat has Started Please Leave":"Private chat has just started.
Sorry, you must leave the room","You are now in private chat":"Vous \u00eates en chat priv\u00e9","Sorry this username is already taken":"D\u00e9sol\u00e9, ce nom d'utilisateur est d\u00e9j\u00e0 pris","Disable youtube":"Disable youtube","you are not allow to request webcam":"D\u00e9sol\u00e9, mais vous n'\u00eates pas autoris\u00e9 \u00e0 demander des webcams priv\u00e9es","kickUserXFromRoom":"Kick %s from room %s","kickFromRoom":"Kick from my room","userDeniedWebcam":"%s denied to access his webcam","userLeftPrivateChat":"User %s has left the private chat","whisperText":"Whisper","mentionText":"Mention","youWillSendWhisperTo":"You will send a whisper to %s","youWillMention":"You will mention to %s","warningAdultRoom":"Warning, you will enter an adult room","yourAge":"Votre age","invalidAge":"\u00c2ge invalide","Reserved to role":"R\u00e9serv\u00e9 au r\u00f4le","NotReserverToRole":"Non r\u00e9serv\u00e9 au r\u00f4le","ThisRoomAllowedToRoleOnly":"This room is allowed only to %s","hour":"Heure","hours":"Heures","day":"Jour","week":"Semaine","month":"Mois","BanUntil":"Interdire jusqu'\u00e0","JailUntil":"Prison jusqu'\u00e0","invisible":"Invisible","maximumWebcamTimeSpent":"Sorry, You reached the maximum authorized time to watch webcams today.","youMustAcceptTermsOfUse":"You must accept the terms of use.","friendModeOnly":"Friend mode only","actionForbiddenToMinors":"Action interdite aux mineurs","Age":"Age","reason":"raison","userReason1":"This person annoys me","userReason2":"Fake profile","userReason3":"This profile represents a company","userReason4":"This profile spams","userReason5":"Other reason","roomReason1":"This room is offensive","roomReason2":"This room is used for abuse","roomReason3":"This room represents a company","roomReason4":"Spam room","roomReason5":"Other reason","vote":"Vote","Are you sure to vote":"Are you sure to vote","User X has voted for you":"<\/i> Congratulations, %s<\/b> has voted for you","Thanks for voting":"Thanks for voting","already Voted":"You already voted for that user.","ThisRoomNotAllowedToGender":"This room is not allowed to gender: %s","ThisRoomNotAllowedToRole":"This room is not allowed to role: %s","ThisRoomAllowedToThisGender":"This room is not available for this gender","ThisRoomNotAllowedToThisRole":"This room is not available for this role","searchRoom":"Rechercher un salon","adultRoom":"Salon pour adultes","youMustSwitchYourWebcam":"You must switch your webcam on to take a snapshot","takeSnapshot":"Upload snapshot","Snapshot":"Snapshot","DoYouWantToTakeThatSnpashot":"Do you want to upload that snpashot ?","youNeedWebcamForExclusiveChat":"You need to switch your cam on to request an excusive chat","call1to1":"Call 1to1","userRequested1to1Chat":"<\/i> %s has requested a video 1to1 call. %s","callingUser":"Calling %s","didNotAnswer":"Sorry, %s<\/b> did not answer to your call","call1to1Ended":"Call with %s has ended","call1to1Refused":"Sorry, but %s<\/b> has refused to take your call","Incoming1to1From":"<\/i> Incoming call1to1 from %s","waiting":"En attendant","youMustSwitchWebcamOn":"Vous devez changer de webcam","switchWebcamAndAcceptCall":"Changer de webcam et accepter l'appel","denyCall":"Refuser l'appel","guestTrialMessage":"Message d'essai pour les invit\u00e9s","Please login to chat panel and start a support ticket":"Please login to chat panel and start a support ticket","areYouSureToCall1to1":"Are you sure you want to call %s ?","notAvaibleInBrowser":"Not availbale in your browser. Use a modern browser such chrome","userHasStartedBroadcasting":"